"""
======================
Author: 柠檬班-小简
Time: 2022/11/2 21:19
Project: day9_framwork_V6
Company: 湖南零檬信息技术有限公司
======================
"""
import re
from loguru import logger

from tools import handle_genrate_data
from tools.global_data import Data


def replace_mark_by_data(to_be_replaced_str, share_obj):
    """
    将字符串当中的，标识符替换成具体的数据。
    标识符的格式是：#标识符#
    从字符串当中，根据正则表达式，提取出来所有要被替换掉的标识符。
    遍历每一个标识符，
    一是从全局变量Data当中去获取数据替换，二是从python生成数据脚本中获取数据替换。
    :param to_be_replaced_str: 含标识符的字符串。像请求数据，前置sql....
    :return: 全面替换完成之后的字符串。
    """
    # 利用正则表达式提取出占位符
    to_be_replaced_mark_list = re.findall("#(\w+)#", to_be_replaced_str)
    logger.info(f"要被替换的占位符有：{to_be_replaced_mark_list}")

    # 如果正则替换取来的是空列表
    if len(to_be_replaced_mark_list) == 0:
        logger.info("没有占位符，不用替换.....")
        return to_be_replaced_str

    # 占位符的数据来自哪里？？ -- 响应结果中提取的，来自全局变量。 -- python脚本造的数据。
    for mark in set(to_be_replaced_mark_list):
        logger.info(f"要被替换的占位符是：{mark}")
        # 判断是否在全局变量Data类的，对象当中。如果是，替换掉
        if hasattr(share_obj, mark):
            logger.info(f"{mark}在全局变量有，且值为{getattr(share_obj, mark)}")
            to_be_replaced_str = to_be_replaced_str.replace(f"#{mark}#", getattr(share_obj, mark))
            logger.info(f"替换原字符串当中#{mark}#完成....")
        elif mark in handle_genrate_data.__all__:
            # 如果不在全局变量当中，则去python脚本当中寻找同名的函数。
            # 调用模块当中的同名函数
            logger.info(f"{mark}在python造数据模块的同名函数中...")
            # 调用函数，并接收它的返回值。
            value = getattr(handle_genrate_data, mark)()
            logger.info(f"函数执行后的数据为：{value}")
            # 用返回值，去替换掉标识符。
            to_be_replaced_str = to_be_replaced_str.replace(f"#{mark}#", str(value))
            logger.info(f"替换原字符串当中#{mark}#完成....")
        else:
            logger.error(f"标识符{mark}即不在全局变量中，也不在python造数据模块中，请确认标识符是否编写正常....")

    return to_be_replaced_str


if __name__ == '__main__':
    req_data = """
    {
     "t": #cur_time#,
     "prodName": "自动化#random_str#",
     "brief": "",
     "video": "",
     "prodNameEn": "sale something",
     "prodNameCn": "自动化#random_str#",
     "contentEn": "<p>https://item.jd.com/669048.html</p>",
     "contentCn": "<p>https://item.jd.com/669048.html</p>",
     "briefEn": "sale good something",
     "briefCn": "卖自动化知识",
     "pic": "#img_path#",
     "imgs": "#img_path#",
     "preSellStatus": 0,
     "preSellTime": null,
     "categoryId": 133,
     "skuList": [{
      "price": 0.01,
      "oriPrice": 0.01,
      "stocks": 100,
      "skuScore": 1,
      "properties": "",
      "skuName": "",
      "prodName": "",
      "weight": 0.1,
      "volume": 2,
      "status": 1,
      "partyCode": "py#cur_time#",
      "prodNameCn": "自动化#random_str#",
      "prodNameEn": "sale something"
     }],
     "tagList": [1],
     "content": "",
     "deliveryTemplateId": 1,
     "totalStocks": 100,
     "price": 0.01,
     "oriPrice": 0.01,
     "deliveryModeVo": {
      "hasShopDelivery": true,
      "hasUserPickUp": false,
      "hasCityDelivery": false
     }
    }
    """


    class Data:
        img_path = "123456767777.png"

    res = replace_mark_by_data(req_data)
